package com.jinwei.qunguanjia.web.system.controller;

import com.jinwei.qunguanjia.common.annotation.Log;
import com.jinwei.qunguanjia.common.constant.UserConstants;
import com.jinwei.qunguanjia.common.core.domain.Response;
import com.jinwei.qunguanjia.common.core.page.PageDataInfo;
import com.jinwei.qunguanjia.common.enums.BusinessTypeEnum;
import com.jinwei.qunguanjia.common.utils.JsonUtils;
import com.jinwei.qunguanjia.common.utils.PageDataUtil;
import com.jinwei.qunguanjia.common.utils.PageUtils;
import com.jinwei.qunguanjia.common.utils.poi.ExcelUtil;
import com.jinwei.qunguanjia.system.dto.SysConfigDTO;
import com.jinwei.qunguanjia.system.service.SysConfigService;
import com.jinwei.qunguanjia.web.system.vo.SysConfigVO;
import org.springframework.beans.BeanUtils;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.util.List;

/**
 * 参数配置 信息操作处理
 * 
 * @author yuanzs
 */
@RestController
@RequestMapping("/system/config")
public class SysConfigController {

    @Resource
    private SysConfigService sysConfigService;

    /**
     * 新增参数配置
     * @param sysConfigVO 对象
     */
    @PreAuthorize("@ss.hasPermission('system:config:save')")
    @Log(title = "参数管理", businessType = BusinessTypeEnum.INSERT)
    @PostMapping("/save")
    public Response add(@Validated @RequestBody SysConfigVO sysConfigVO) throws IllegalAccessException {
        SysConfigDTO sysConfigDTO = new SysConfigDTO();
        BeanUtils.copyProperties(sysConfigVO, sysConfigDTO);
        if (UserConstants.NOT_UNIQUE.equals(sysConfigService.checkConfigKeyUnique(sysConfigDTO))) {
            return Response.fail("新增参数'" + sysConfigVO.getConfigName() + "'失败，参数键名已存在");
        }
        sysConfigService.save(sysConfigDTO);
        return Response.success();
    }

    /**
     * 修改参数配置
     * @param sysConfigVO 对象
     */
    @PreAuthorize("@ss.hasPermission('system:config:update')")
    @Log(title = "参数管理", businessType = BusinessTypeEnum.UPDATE)
    @PutMapping("/update")
    public Response edit(@Validated @RequestBody SysConfigVO sysConfigVO) throws IllegalAccessException {
        SysConfigDTO sysConfigDTO = new SysConfigDTO();
        BeanUtils.copyProperties(sysConfigVO, sysConfigDTO);
        if (UserConstants.NOT_UNIQUE.equals(sysConfigService.checkConfigKeyUnique(sysConfigDTO))) {
            return Response.fail("修改参数'" + sysConfigVO.getConfigName() + "'失败，参数键名已存在");
        }
        sysConfigService.update(sysConfigDTO);
        return Response.success();
    }

    /**
     * 删除参数配置
     * @param ids id列表
     */
    @PreAuthorize("@ss.hasPermission('system:config:remove')")
    @Log(title = "参数管理", businessType = BusinessTypeEnum.DELETE)
    @DeleteMapping("/{ids}")
    public Response remove(@PathVariable List<String> ids)
    {
        sysConfigService.remove(ids);
        return Response.success();
    }

    /**
     * 获取参数配置列表
     */
    @PreAuthorize("@ss.hasPermission('system:config:list')")
    @GetMapping("/list")
    public PageDataInfo list(SysConfigVO sysConfigVO) throws IllegalAccessException {
        SysConfigDTO sysConfigDTO = new SysConfigDTO();
        BeanUtils.copyProperties(sysConfigVO, sysConfigDTO);
        PageUtils.startPage();
        PageDataInfo<SysConfigDTO> pageDataInfo = sysConfigService.listPage(sysConfigDTO);
        PageDataUtil<SysConfigDTO, SysConfigVO> pageDataUtil = new PageDataUtil<>();
        return pageDataUtil.transform(pageDataInfo, SysConfigVO.class);
    }

    @Log(title = "参数管理", businessType = BusinessTypeEnum.EXPORT)
    @PreAuthorize("@ss.hasPermission('system:config:export')")
    @PostMapping("/export")
    public void export(HttpServletResponse response, SysConfigVO sysConfigVO) throws IllegalAccessException {
        SysConfigDTO sysConfigDTO = new SysConfigDTO();
        BeanUtils.copyProperties(sysConfigVO, sysConfigDTO);
        List<SysConfigDTO> list = sysConfigService.list(sysConfigDTO);
        ExcelUtil<SysConfigVO> util = new ExcelUtil<>(SysConfigVO.class);
        util.exportExcel(response, JsonUtils.copyList(list, SysConfigVO.class), "参数数据");
    }

    /**
     * 根据参数编号获取详细信息
     */
    @PreAuthorize("@ss.hasPermission('system:config:query')")
    @GetMapping(value = "/{configId}")
    public Response<SysConfigVO> getInfo(@PathVariable String configId) {
        SysConfigDTO sysConfigDTO = sysConfigService.get(configId);
        SysConfigVO sysConfigVO = new SysConfigVO();
        BeanUtils.copyProperties(sysConfigDTO, sysConfigVO);
        return Response.success(sysConfigVO);
    }

    /**
     * 根据参数键名查询参数值
     */
    @GetMapping(value = "/configKey/{configKey}")
    public Response<SysConfigVO> getConfigKey(@PathVariable String configKey) throws IllegalAccessException {
        SysConfigDTO sysConfigDTO = new SysConfigDTO();
        sysConfigDTO.setConfigKey(configKey);
        sysConfigDTO = sysConfigService.get(sysConfigDTO);
        SysConfigVO sysConfigVO = new SysConfigVO();
        BeanUtils.copyProperties(sysConfigDTO, sysConfigVO);
        return Response.success(sysConfigVO);
    }

    /**
     * 刷新参数缓存
     */
    @PreAuthorize("@ss.hasPermission('system:config:remove')")
    @Log(title = "参数管理", businessType = BusinessTypeEnum.REFRESH_CACHE)
    @DeleteMapping("/refreshCache")
    public Response refreshCache() throws IllegalAccessException {
        sysConfigService.resetConfigCache();
        return Response.success();
    }
}
